package bankowosc;

import java.util.ArrayList;
import java.util.Collections;

import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;

import bankowosc.dane.Harmonogram_splat;
import bankowosc.dane.Klient;
import bankowosc.dane.Kredyt;
import bankowosc.dane.Rachunek;
import bankowosc.dane.Rodzaj_kredytu;
import bankowosc.dane.Status;
import bankowosc.dane.Umowa;
import bankowosc.dane.Waluta;
import bankowosc.polaczenie.Harmonogram_splatBD;
import bankowosc.polaczenie.KredytBD;
import bankowosc.polaczenie.RachunekBD;
import bankowosc.polaczenie.Rodzaj_kredytuBD;
import bankowosc.polaczenie.StatusDB;
import bankowosc.polaczenie.UmowaBD;
import bankowosc.polaczenie.WalutaBD;
import bankowosc.polaczenie.polacz;

import javax.swing.JComboBox;
import javax.swing.JLabel;

import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JTextField;

public class KredytPanel extends JPanel {

	private Klient klient;
	private ArrayList<Rachunek> rachunki;
	private ArrayList<Kredyt> kredyty;
	private ArrayList<Rodzaj_kredytu> rodzajekred;
	private ArrayList<Waluta> waluty;
	private ArrayList<Harmonogram_splat> harmonogr;
	
	private JComboBox cbRachunki;
	private JScrollPane scrollPane;
	private JScrollPane scrollPane2;
	private JPanel panel;
	private JPanel panel_1;
	private JPanel panel_2;
	private JPanel panel_3;
	private JComboBox cbRaty;
	private JComboBox cbWaluta;
	private JTextField kwota_textField;
	private ArrayList<JButton> harm;
	
	private String wybrodzaj;
	private int oprocent = 1;
	private int nr;
	
	private polacz p;
	private KredytBD kredytbd;
	private Harmonogram_splatBD harmnbd;
	
	public KredytPanel(final polacz p) {

		setLayout(null);
		
		this.p = p;
		
		Rodzaj_kredytuBD rodz_kredytubd = new Rodzaj_kredytuBD();
		rodzajekred = rodz_kredytubd.pobierzRodzajKredytu(p);
		wybrodzaj = "";
		
		WalutaBD walutabd = new WalutaBD();
		waluty = walutabd.pobierzWalute(p);
		
		kredytbd = new KredytBD();
		harmnbd = new Harmonogram_splatBD();
		
		panel = new JPanel();
		panel.setBounds(0, 80, 710, 380);
		panel.setLayout(null);
		add(panel);
		
		panel_1 = new JPanel();
		panel_1.setPreferredSize(new Dimension(697,399));
		panel_1.setLayout(null);
		
		panel_3 = new JPanel();
		panel_3.setPreferredSize(new Dimension(750,399));
		panel_3.setLayout(null);
		
		panel_2 = new JPanel();
		panel_2.setVisible(false);
		panel_2.setBounds(0, 80, 710, 380);
		panel_2.setLayout(null);
		add(panel_2);
		
		scrollPane = new JScrollPane(panel_1);
		scrollPane.setVisible(false);
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane.setBounds(0, 80, 697, 380);
		add(scrollPane);
		
		scrollPane2 = new JScrollPane(panel_3);
		scrollPane2.setVisible(false);
		scrollPane2.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		scrollPane2.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		scrollPane2.setBounds(0, 80, 750, 380);
		add(scrollPane2);
		
		final JLabel lblPodajKwotKredytu = new JLabel("Podaj kwot\u0119 kredytu.");
		lblPodajKwotKredytu.setVisible(false);
		lblPodajKwotKredytu.setBounds(341, 73, 264, 14);
		panel.add(lblPodajKwotKredytu);
		
		harm = new ArrayList<>();
		
		JButton btnNowyKredyt = new JButton("Nowy kredyt");
		btnNowyKredyt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cbRachunki.setEnabled(true);
				panel.setVisible(true);
				scrollPane.setVisible(false);
				scrollPane2.setVisible(false);
				panel_2.setVisible(false);
				lblPodajKwotKredytu.setVisible(false);
			}
		});
		btnNowyKredyt.setBounds(10, 5, 120, 28);
		add(btnNowyKredyt);
		
		JButton btnKredyty = new JButton("Kredyty");
		btnKredyty.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cbRachunki.setEnabled(true);
				panel.setVisible(false);
				scrollPane.setVisible(true);
				scrollPane2.setVisible(false);
				panel_2.setVisible(false);
				kredyty = kredytbd.pobierzKredyty(p, rachunki.get(cbRachunki.getSelectedIndex()).getNr_rachunku());
				panel_1.removeAll();
				int wysokosc = 0;
				for(int i=0; i<kredyty.size(); i++) {
					JLabel nrkredytu = new JLabel("Numer kredytu: "+kredyty.get(i).getId_kredytu());
					nrkredytu.setBounds(12, 10+i*190, 300, 15);
					panel_1.add(nrkredytu);
					for(int j=0; j<rodzajekred.size(); j++) {
						if(kredyty.get(i).getId_rodzaju_kredytu() == rodzajekred.get(j).getId_rodzaju_kredytu()) {
							JLabel rodzaj = new JLabel("Rodzaj kredytu: "+rodzajekred.get(j).getNazwa_rodzaju_kredytu().toLowerCase());
							rodzaj.setBounds(50, 40+i*190, 300, 15);
							panel_1.add(rodzaj);
							JLabel lrat = new JLabel("Liczba rat kredytu: "+rodzajekred.get(j).getLiczba_rat());
							lrat.setBounds(50, 70+i*190, 300, 15);
							panel_1.add(lrat);
						}
					}
					JLabel okres = new JLabel("Kredyt zaci�gni\u0119to "+kredyty.get(i).getData_rozpoczecia_kredytu()+" i ostatnia rata powinna zosta� sp�acona "+kredyty.get(i).getData_zakonczenia_kredytu());
					okres.setBounds(50, 100+i*190, 500, 15);
					panel_1.add(okres);
					String waluta = "";
					for(int j=0; j<waluty.size(); j++)
						if(kredyty.get(i).getId_waluty() == waluty.get(j).getId_waluty())
							waluta = waluty.get(j).getSkrot_waluty();
					JLabel kwota = new JLabel("Kwota kredytu wynosi: "+kredyty.get(i).getKwota()+" "+waluta);
					kwota.setBounds(50, 130+i*190, 300, 15);
					panel_1.add(kwota);
					harm.add(new JButton("Harmonogram"));
					harm.get(i).setBounds(50, 160+i*190, 150, 20);
					harm.get(i).addActionListener(new ActionListener() {
						public void actionPerformed(ActionEvent e) {
							cbRachunki.setEnabled(false);
							scrollPane.setVisible(false);
							scrollPane2.setVisible(true);
							panel_3.removeAll();
							JButton btn = (JButton) e.getSource();
							nr = -1;
							for(int i=0; i<harm.size(); i++) {
								if(btn.getY() == harm.get(i).getY())
									nr = i;
							}
							JLabel nrkredytu = new JLabel("Numer kredytu: "+kredyty.get(nr).getId_kredytu());
							nrkredytu.setBounds(12, 10, 300, 15);
							panel_3.add(nrkredytu);
							harmonogr = harmnbd.pobierzHarmonogr(p, kredyty.get(nr).getId_kredytu());
							Collections.sort(harmonogr);
							String[] nazwkolumn = {"Rata","Termin","Sp\u0142acone","Kapita\u0142owa","Odsetkowa","Karne ods","Ca�kowita","Pozosta\u0142a"};
							final Object[][] rzedy = new Object[harmonogr.size()+1][8];
							rzedy[0][0] = "Rata";
							rzedy[0][1] = "Termin";
							rzedy[0][2] = "Sp\u0142acone";
							rzedy[0][3] = "Kapita\u0142owa";
							rzedy[0][4] = "Odsetkowa";
							rzedy[0][5] = "Karne ods";
							rzedy[0][6] = "Ca\u0142kowita";
							rzedy[0][7] = "Pozosta\u0142a";
							for(int i=0; i<harmonogr.size(); i++) {
								rzedy[i+1][0] = harmonogr.get(i).getNr_raty();
								rzedy[i+1][1] = harmonogr.get(i).getData_splaty_raty_przewidywana();
								rzedy[i+1][2] = harmonogr.get(i).getData_splaty_raty_wykonana();
								rzedy[i+1][3] = harmonogr.get(i).getRata_kapitalowa();
								rzedy[i+1][4] = harmonogr.get(i).getRata_odsetkowa();
								rzedy[i+1][5] = harmonogr.get(i).getKarne_odsetki();
								rzedy[i+1][6] = harmonogr.get(i).getCalkowita_kwota_raty();
								rzedy[i+1][7] = harmonogr.get(i).getKwota_pozostala_do_splaty();
								final JTable harmtabela = new JTable(rzedy,nazwkolumn);
								harmtabela.setBounds(12, 40, 600, 16*(harmonogr.size()+1));
								harmtabela.sizeColumnsToFit(1);
								harmtabela.getColumn("Rata").setMaxWidth(40);
								harmtabela.setEnabled(false);
								panel_3.add(harmtabela);
								StatusDB stbd = new StatusDB();
								String status = stbd.pobierz_status(p, String.valueOf(harmonogr.get(i).getId_statusu())).getNazwa();
								if(status.compareTo("Rata splacona") == 0) {
									JLabel stat = new JLabel("Rata splacona");
									stat.setBounds(615, 55+i*16, 100, 20);
									panel_3.add(stat);
								}
								else if(status.compareTo("Rata niesplacona") == 0) {
									final JButton splata = new JButton("Sp\u0142ata");
									splata.setBounds(610, 55+i*16, 80, 20);
									splata.addActionListener(new ActionListener() {
										@Override
										public void actionPerformed(ActionEvent arg0) {
											UmowaBD umbd = new UmowaBD();
											ArrayList<Umowa> umowy = umbd.pobierzUmowy(p, klient.getId_klienta());
											RachunekBD rachbd = new RachunekBD();
											rachunki = rachbd.pobierzRachunki(p, umowy);
											double wal = 1;
											for(int i=0; i<waluty.size(); i++) {
												if(waluty.get(i).getId_waluty() == kredyty.get(nr).getId_waluty())
													if(waluty.get(i).getSkrot_waluty().compareTo("PLN") != 0)
														wal = waluty.get(i).getKurs_waluty();
											}
											int nrhar = (splata.getY()-55)/16;
											if(rachunki.get(cbRachunki.getSelectedIndex()).getSaldo_dostepne()>harmonogr.get(nrhar).getCalkowita_kwota_raty()*wal) {
												harmnbd.edytujHarm(p, harmonogr.get(nrhar).getId_harmonogramu());
												harmonogr = harmnbd.pobierzHarmonogr(p, kredyty.get(nr).getId_kredytu());
												Collections.sort(harmonogr);
												JLabel stat = new JLabel("Rata splacona");
												stat.setBounds(615, 55+nrhar*16, 100, 20);
												panel_3.add(stat);
												splata.setVisible(false);
												rzedy[nrhar+1][2] = harmonogr.get(nrhar).getData_splaty_raty_wykonana();
												if(nrhar+2<harmonogr.size()) {
													rzedy[nrhar+2][5] = harmonogr.get(nrhar+1).getKarne_odsetki();
													rzedy[nrhar+2][6] = harmonogr.get(nrhar+1).getCalkowita_kwota_raty();
												}
												harmtabela.updateUI();
												panel_3.updateUI();
											} else {
												JLabel info = new JLabel("Za ma\u0142o \u015Brodk\u00F3w na koncie.");
												info.setBounds(200, 10, 300, 15);
												panel_3.add(info);
												panel_3.updateUI();
											}
										}
									});
									panel_3.add(splata);
								}
							}
							panel_3.setPreferredSize(new Dimension(697,18*(harmonogr.size()+1)+80));
							panel_3.updateUI();
						}
					});
					panel_1.add(harm.get(i));
					wysokosc += 190;
				}
				panel_1.setPreferredSize(new Dimension(750,wysokosc));
				panel_1.updateUI();
			}
		});
		btnKredyty.setBounds(140, 5, 120, 28);
		add(btnKredyty);
		
		cbRachunki = new JComboBox();
		cbRachunki.setBounds(120, 45, 216, 25);
		cbRachunki.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				kredyty = kredytbd.pobierzKredyty(p, rachunki.get(cbRachunki.getSelectedIndex()).getNr_rachunku());
			}
		});
		add(cbRachunki);
		
		JLabel label = new JLabel("Wybierz rachunek:");
		label.setBounds(12, 51, 120, 14);
		add(label);
		
		JLabel lblWybierzKredyt = new JLabel("Wybierz kredyt:");
		lblWybierzKredyt.setBounds(12, 11, 106, 14);
		panel.add(lblWybierzKredyt);
		
		JLabel lblLiczbaRat = new JLabel("Liczba rat:");
		lblLiczbaRat.setBounds(12, 42, 80, 14);
		panel.add(lblLiczbaRat);
		
		cbRaty = new JComboBox();
		cbRaty.setBounds(150, 37, 180, 25);
		panel.add(cbRaty);
		
		JLabel lblKwota = new JLabel("Kwota:");
		lblKwota.setBounds(12, 73, 62, 14);
		panel.add(lblKwota);
		
		kwota_textField = new JTextField();
		kwota_textField.setBounds(150, 68, 180, 25);
		panel.add(kwota_textField);
		kwota_textField.setColumns(10);
		
		JLabel lblWaluta = new JLabel("Waluta:");
		lblWaluta.setBounds(12, 104, 62, 14);
		panel.add(lblWaluta);
		
		cbWaluta = new JComboBox();
		cbWaluta.setBounds(150, 101, 180, 25);
		panel.add(cbWaluta);
		
		ButtonGroup radiogroup2 = new ButtonGroup();
		JLabel lblOprocentowanie = new JLabel("Raty:");
		lblOprocentowanie.setBounds(12, 135, 120, 14);
		panel.add(lblOprocentowanie);
		JRadioButton rdbtnStae = new JRadioButton("sta\u0142e");
		rdbtnStae.setSelected(true);
		rdbtnStae.setBounds(150, 132, 80, 23);
		rdbtnStae.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				oprocent = 1;
			}
		});
		radiogroup2.add(rdbtnStae);
		panel.add(rdbtnStae);
		
		JRadioButton rdbtnZmienne = new JRadioButton("zmienne");
		rdbtnZmienne.setBounds(229, 132, 109, 23);
		rdbtnZmienne.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				oprocent = 2;
			}
		});
		radiogroup2.add(rdbtnZmienne);
		panel.add(rdbtnZmienne);
		
		JLabel lblWybranyKredytZosta = new JLabel("Wybrany kredyt zosta\u0142 dodany do rachunku.");
		lblWybranyKredytZosta.setSize(400, 20);
		lblWybranyKredytZosta.setLocation(100, 100);
		panel_2.add(lblWybranyKredytZosta);
		
		for(int i=0; i<waluty.size(); i++) 
			cbWaluta.addItem(waluty.get(i).getNazwa_waluty());
		
		
		ButtonGroup radiogroup = new ButtonGroup();
		ArrayList<JRadioButton> rodzaje = new ArrayList<>();
		for(int i=0; i<rodzajekred.size(); i++) {
			if(i==0) {
				rodzaje.add(new JRadioButton(rodzajekred.get(i).getNazwa_rodzaju_kredytu()));
				rodzaje.get(i).setSelected(true);
				wybrodzaj = rodzaje.get(i).getText();
				for(int j=0; j<rodzajekred.size(); j++) {
					if(wybrodzaj.compareTo(rodzajekred.get(j).getNazwa_rodzaju_kredytu())==0) {
						if(cbRaty.getItemCount()==0)
							cbRaty.addItem(rodzajekred.get(j).getLiczba_rat());
						else if((int)(cbRaty.getItemAt(cbRaty.getItemCount()-1))!=rodzajekred.get(j).getLiczba_rat())
							cbRaty.addItem(rodzajekred.get(j).getLiczba_rat());
					}
				}
			}
			else {
				boolean czyjest = false;
				for(int j=0; j<i; j++) {
					if(rodzajekred.get(j).getNazwa_rodzaju_kredytu().compareTo(rodzajekred.get(i).getNazwa_rodzaju_kredytu())==0) 
						czyjest = true;
				}
				if(czyjest==false)
					rodzaje.add(new JRadioButton(rodzajekred.get(i).getNazwa_rodzaju_kredytu()));
			}
		}
		for(int i=0; i<rodzaje.size(); i++) {
			final String tytul = rodzaje.get(i).getText();
			rodzaje.get(i).setBounds(150+140*i, 6, 120, 25);
			rodzaje.get(i).addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					wybrodzaj = tytul;
					cbRaty.removeAllItems();
					kwota_textField.setText("");
					for(int j=0; j<rodzajekred.size(); j++) {
						if(wybrodzaj.compareTo(rodzajekred.get(j).getNazwa_rodzaju_kredytu())==0) {
							if(cbRaty.getItemCount()==0)
								cbRaty.addItem(rodzajekred.get(j).getLiczba_rat());
							else if((int)(cbRaty.getItemAt(cbRaty.getItemCount()-1))!=rodzajekred.get(j).getLiczba_rat())
								cbRaty.addItem(rodzajekred.get(j).getLiczba_rat());
						}
					}
				}
			});
			radiogroup.add(rodzaje.get(i));
			panel.add(rodzaje.get(i));
		}
		
		JButton btnDodajKredyt = new JButton("Dodaj kredyt");
		btnDodajKredyt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				lblPodajKwotKredytu.setVisible(false);
				if(kwota_textField.getText().length() != 0) {
					boolean czydodano = false;
					if(oprocent == 1)
						czydodano = kredytbd.dodajKredytStaly(p, klient.getId_klienta(), rachunki.get(cbRachunki.getSelectedIndex()).getNr_rachunku(), wybrodzaj, String.valueOf(cbWaluta.getSelectedItem()), (int)cbRaty.getSelectedItem(), Float.valueOf(kwota_textField.getText()));
					else if(oprocent == 2)
						czydodano = kredytbd.dodajKredytZmienny(p, klient.getId_klienta(), rachunki.get(cbRachunki.getSelectedIndex()).getNr_rachunku(), wybrodzaj, String.valueOf(cbWaluta.getSelectedItem()), (int)cbRaty.getSelectedItem(), Float.valueOf(kwota_textField.getText()));
					if(czydodano) {
						kredyty = kredytbd.pobierzKredyty(p, rachunki.get(cbRachunki.getSelectedIndex()).getNr_rachunku());
						panel.setVisible(false);
						panel_2.setVisible(true);
					}
				} else {
					lblPodajKwotKredytu.setVisible(true);
				}
			}
		});
		btnDodajKredyt.setBounds(110, 178, 120, 28);
		panel.add(btnDodajKredyt);
		
	}

	public void setKlient(Klient klient) {
		this.klient = klient;
	}

	public void setRachunki(ArrayList<Rachunek> rachunki) {
		this.rachunki = rachunki;
		for(int i=0; i<rachunki.size(); i++)
			cbRachunki.addItem(rachunki.get(i).getNr_rachunku());
		kredyty = kredytbd.pobierzKredyty(p, rachunki.get(0).getNr_rachunku());
	}
}
